"""
通知日志商品明细数据模型
"""

from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, DECIMAL
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from typing import Dict, Any, List
from datetime import datetime

from app.database import Base


class NotifyLogProduct(Base):
    """通知日志商品明细表"""
    __tablename__ = "notify_logs_product"

    # 基础字段
    id = Column(Integer, primary_key=True, index=True, comment="主键ID")
    notify_log_id = Column(Integer, ForeignKey("notify_logs.id"), nullable=False, index=True, comment="通知日志ID")
    
    # 商品详细信息
    product_name = Column(String(200), nullable=False, comment="商品名称")
    product_price = Column(DECIMAL(10, 2), nullable=True, comment="商品价格")
    product_image = Column(String(500), nullable=True, comment="商品图片URL")
    product_url = Column(String(500), nullable=True, comment="商品链接")
    
    # 时间字段
    created_at = Column(DateTime(timezone=True), server_default=func.now(), comment="创建时间")
    
    # 关联关系
    notify_log = relationship("NotifyLog", back_populates="products")
    
    @classmethod
    def create_from_product(cls, notify_log_id: int, product: Dict[str, Any], monitor_type: str = "keyword") -> "NotifyLogProduct":
        """
        从商品数据创建通知日志商品记录
        
        Args:
            notify_log_id: 通知日志ID
            product: 商品数据
            monitor_type: 监控类型（keyword/seller/shop）
            
        Returns:
            NotifyLogProduct实例
        """
        # 提取商品信息
        product_name = product.get('name', '')
        product_price = product.get('price')
        
        # 处理图片URL
        product_image = None
        if product.get('image_url'):
            product_image = product['image_url']
        elif product.get('thumbnail'):
            product_image = product['thumbnail']
        elif isinstance(product.get('thumbnails'), list) and len(product.get('thumbnails', [])) > 0:
            product_image = product.get('thumbnails')[0]
        
        # 构建商品链接 - 根据监控类型使用不同的URL格式
        product_url = None
        if product.get('id'):
            if monitor_type == "shop":
                # 店铺监控使用 shops/product 格式
                product_url = f"https://jp.mercari.com/shops/product/{product['id']}"
            else:
                # 关键词和卖家监控使用 item 格式
                product_url = f"https://jp.mercari.com/item/{product['id']}"
        
        return cls(
            notify_log_id=notify_log_id,
            product_name=product_name,
            product_price=product_price,
            product_image=product_image,
            product_url=product_url
        )
    
    @classmethod
    def create_batch_from_products(cls, notify_log_id: int, products: List[Dict[str, Any]], monitor_type: str = "keyword") -> List["NotifyLogProduct"]:
        """
        批量从商品数据创建通知日志商品记录
        
        Args:
            notify_log_id: 通知日志ID
            products: 商品数据列表
            monitor_type: 监控类型（keyword/seller/shop）
            
        Returns:
            NotifyLogProduct实例列表
        """
        return [cls.create_from_product(notify_log_id, product, monitor_type) for product in products]
    
    def to_dict(self) -> Dict[str, Any]:
        """转换为字典格式"""
        return {
            'id': self.id,
            'notify_log_id': self.notify_log_id,
            'product_name': self.product_name,
            'product_price': float(self.product_price) if self.product_price else None,
            'product_image': self.product_image,
            'product_url': self.product_url,
            'created_at': self.created_at.isoformat() if self.created_at else None
        }
    
    def __repr__(self) -> str:
        return (f"<NotifyLogProduct(id={self.id}, notify_log_id={self.notify_log_id}, "
                f"product_name='{self.product_name[:20]}...')>")